// utils/wxAuth.js
import api from '@/api/modules';
import { useUserStore } from '@/stores';
import { token, storage } from '@/utils';

/**
 * 获取微信登录所需的数据（code 和 用户信息）
 * @returns {Promise<Object>} 登录数据对象
 */
export const getWxLoginData = () => {
  return new Promise((resolve, reject) => {
    uni.login({
      provider: 'weixin',
      success: (loginRes) => {
        if (loginRes.code) {
          // 使用 uni.getUserProfile 代替 wx.getUserInfo（符合新规则）
          uni.getUserProfile({
            desc: '用于完善用户资料',
            success: (userInfoRes) => {
              // 构建登录请求参数
              const loginData = {
                code: loginRes.code,
                encryptedData: userInfoRes.encryptedData,
                iv: userInfoRes.iv
              };
              resolve(loginData);
            },
            fail: (error) => {
              console.error('获取用户信息失败', error);
              reject(new Error('获取用户信息失败，请检查授权设置'));
            }
          });
        } else {
          console.error('微信登录失败', loginRes);
          reject(new Error('登录失败: ' + (loginRes.errMsg || '未知错误')));
        }
      },
      fail: (error) => {
        console.error('微信登录调用失败', error);
        reject(new Error('微信登录调用失败，请稍后重试'));
      }
    });
  });
};

/**
 * 通过手机号获取登录数据
 * @param {Object} phoneData 手机号数据
 * @returns {Promise<Object>} 登录数据对象
 */
export const getWxPhoneLoginData = async (phoneData) => {
  // 先获取登录code
  return new Promise((resolve, reject) => {
    uni.login({
      provider: 'weixin',
      success: (loginRes) => {
        if (loginRes.code) {
          const loginData = {
            code: loginRes.code,
            encryptedData: phoneData.encryptedData,
            iv: phoneData.iv
          };
          resolve(loginData);
        } else {
          reject(new Error('获取登录凭证失败'));
        }
      },
      fail: (error) => {
        reject(error);
      }
    });
  });
};

/**
 * 发送微信登录请求到服务器
 * @param {Object} loginData 登录数据
 * @returns {Promise<Object>} 服务器响应
 */
export const wxLoginRequest = async (loginData) => {
  try {
    return await api.auth.wxLogin(loginData);
  } catch (error) {
    console.error('微信登录请求失败', error);
    throw error;
  }
};

/**
 * 处理登录成功后的操作
 * @param {Object} responseData 服务器响应数据
 */
export const handleLoginSuccess = (responseData) => {
  const { token: accessToken, refreshToken, userId, ...userInfo } = responseData;
  
  // 保存令牌
  token.setToken(accessToken);
  token.setRefreshToken(refreshToken);
  
  // 保存用户ID
  storage.setItem('userId', userId);
  
  // 保存用户信息
  storage.setItem('userInfo', userInfo);
  
  // 更新 Pinia 状态
  const userStore = useUserStore();
  
  // 使用userStore的标准方法处理登录成功，确保触发loginStateChanged事件
  if (userStore.exportHandleLoginSuccess) {
    // 新方法：使用统一的登录处理函数，确保触发数据刷新事件
    userStore.exportHandleLoginSuccess({
      code: 200,
      data: {
        token: accessToken,
        refreshToken,
        userId,
        ...userInfo
      }
    });
  } else {
    // 旧方法：直接设置状态，但不会触发数据刷新事件
    userStore.setUserInfo(userInfo);
    userStore.setLoginState(true);
    
    // 手动触发登录状态变化事件，确保数据刷新
    uni.$emit('loginStateChanged', { isLogin: true });
  }
};

/**
 * 统一的微信登录处理函数
 * @param {Object} phoneData 可选的手机号数据
 * @returns {Promise<Object>} 登录结果
 */
export const handleWxLogin = async (phoneData = null) => {
  try {
    // 获取登录数据
    const loginData = phoneData 
      ? await getWxPhoneLoginData(phoneData)
      : await getWxLoginData();
    
    // 发送登录请求
    const res = await wxLoginRequest(loginData);
    
    if (res && res.data) {
      // 处理登录成功
      handleLoginSuccess(res.data);
      
      // 额外手动触发登录状态变化事件，确保各页面能刷新数据
      uni.$emit('loginStateChanged', { isLogin: true });
      
      return {
        success: true,
        data: res.data
      };
    }
    
    return {
      success: false,
      message: '登录失败，返回数据格式错误'
    };
  } catch (error) {
    console.error('微信登录失败', error);
    return {
      success: false,
      message: error.message || '微信登录请求失败'
    };
  }
};

/**
 * 静默登录 - 仅使用code进行登录，不请求用户信息
 * 适用于已登录过的用户自动登录
 * @returns {Promise<Object>} 登录结果
 */
export const silentWxLogin = async () => {
  try {
    const loginRes = await new Promise((resolve, reject) => {
      uni.login({
        provider: 'weixin',
        success: resolve,
        fail: reject
      });
    });
    
    if (!loginRes.code) {
      return {
        success: false,
        message: '获取登录凭证失败'
      };
    }
    
    // 仅发送code到服务器
    const res = await api.auth.wxLogin({ code: loginRes.code });
    
    if (res && res.data) {
      // 处理登录成功
      handleLoginSuccess(res.data);
      
      // 额外手动触发登录状态变化事件，确保各页面能刷新数据
      uni.$emit('loginStateChanged', { isLogin: true });
      
      return {
        success: true,
        data: res.data
      };
    }
    
    return {
      success: false,
      message: '登录失败，返回数据格式错误'
    };
  } catch (error) {
    console.error('静默登录失败', error);
    return {
      success: false,
      message: error.message || '静默登录失败'
    };
  }
};

export default {
  getWxLoginData,
  getWxPhoneLoginData,
  wxLoginRequest,
  handleLoginSuccess,
  handleWxLogin,
  silentWxLogin
};